package pl.koziolekweb.szkola.KIChatSerwerTCP;

// KI-ChatSerwerTCP/SerwerCzatu.java
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;

/** Najprostszy serwer czatu; T.R. Werner, 2006 */
public class SerwerCzatu {

    final static int PORT = 54321;
    static Set<Rozmowa> rozmowy = new HashSet<Rozmowa>();

    synchronized
    static void addRozmowa(Rozmowa Rozmowa) {
        rozmowy.add(Rozmowa);
    }

    synchronized
    static void removeRozmowa(Rozmowa Rozmowa) {
        rozmowy.remove(Rozmowa);
    }

    synchronized
    static void broadcast(String nick,
                                       String message) {
        message = nick + ": " + message;
        for (Rozmowa t : rozmowy) t.out.println(message);
    }


    public static void main(String... args) {

        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(PORT,15);
            System.err.println("Serwer wystartowal...");
        } catch(IOException e) {
            System.err.println("Serwer padl...");
            System.exit(1);
        }

        while (true) {
            try {
                Socket soc = serverSocket.accept();
                Rozmowa r = new Rozmowa(soc);
                r.start();
            } catch(IOException e) {
                System.err.println("Polaczenie padlo...");
            }
        }
    }

      // Klasa pojedynczej rozmowy
    static class Rozmowa extends Thread {
        Socket         soc = null;
        BufferedReader  in = null;
        PrintWriter    out = null;
        String        nick;

        Rozmowa(Socket soc) {
            try {
                out = new PrintWriter(
                          new OutputStreamWriter(
                              soc.getOutputStream()),true);
                in  = new BufferedReader(
                          new InputStreamReader(
                              soc.getInputStream()));
            } catch(IOException e) { return; }
        }

        public void run() {
            String line;
            try {
                nick = in.readLine();
                if (nick == null) return;
                SerwerCzatu.addRozmowa(this);
                SerwerCzatu.broadcast(nick,"WSZEDL");

                while (true) {
                    line = in.readLine();
                    if (line == null) return;
                    SerwerCzatu.broadcast(nick,line);
                }

            } catch (IOException ignore) {
            } finally {

                SerwerCzatu.removeRozmowa(this);
                SerwerCzatu.broadcast(nick,"WYSZEDL");
                try { if (in  != null)  in.close(); }
                catch(IOException ignore) { }
                if (out != null) out.close();
                try { if (soc != null) soc.close(); }
                catch(IOException ignore) { }
            }
        }
    }
}